package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingDao;
import com.itheima.entity.Result;
import com.itheima.pojo.Member;
import com.itheima.pojo.Order;
import com.itheima.pojo.OrderSetting;
import com.itheima.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 体检预约服务
 */
@Service
@Transactional
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderSettingDao orderSettingDao;

    @Autowired
    private MemberDao memberDao;

    @Autowired
    private OrderDao orderDao;

    //体检预约
    @Override
    public Result order(Map map) {
        //检查当前日期是否进行了预约设置
        String orderDateStr = (String) map.get("orderDate");
        Date orderDate = null;
        try {
            orderDate = DateUtils.parseString2Date(orderDateStr);
        } catch (Exception e) {
            e.printStackTrace();
            return new Result(false, MessageConstant.ORDER_FAIL);
        }
        OrderSetting orderSetting = orderSettingDao.findByOrderDate(orderDate);

        //OrderSetting orderSetting = orderSettingDao.findByOrderDate(orderDateStr);
        if(orderSetting == null){
            return new Result(false,MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }else{
            //检查预约日期是否预约已满
            int number = orderSetting.getNumber();//可预约人数
            int reservations = orderSetting.getReservations();//已预约人数
            if(reservations >= number){
                //预约已满,不能预约
                return new Result(false,MessageConstant.ORDER_FULL);
            }else {
                //检查当前用户是否为会员，根据手机号判断
                String telephone = (String) map.get("telephone");
                Member member = memberDao.findByTelephone(telephone);
                if(member == null){
                    //当前用户不是会员，需要添加到会员表
                    member = new Member();
                    member.setName((String)map.get("name"));
                    member.setPhoneNumber(telephone);
                    member.setIdCard((String)map.get("idCard"));
                    member.setSex((String)map.get("sex"));
                    member.setRegTime(new Date());
                    this.memberDao.add(member);
                }else{
                    Integer memberId = member.getId();
                    int setmealId = Integer.parseInt((String) map.get("setmealId"));
                    Order order = new Order();
                    order.setMemberId(memberId);
                    order.setOrderDate(orderDate);
                    order.setSetmealId(setmealId);
                    List<Order> list = orderDao.findByCondition(order);
                    if(list != null && list.size() >0){
                        //已经完成了预约，不能重复预约
                        return new Result(false,MessageConstant.HAS_ORDERED);
                    }
                }
                //可以预约，设置预约人数加一
                orderSetting.setReservations(orderSetting.getReservations()+1);
                orderSettingDao.editReservationsByOrderDate(orderSetting);
                Order order = new Order(member.getId(), orderDate, (String)map.get("orderType"), "未到诊", Integer.parseInt((String)map.get("setmealId")));
                //保存预约信息到预约表
                orderDao.add(order);
                return new Result(true,MessageConstant.ORDER_SUCCESS,order.getId());
            }
        }

    }

    //根据id查询预约信息，包括体检人信息、套餐信息
    @Override
    public Map findById(Integer id) {
        Map map = orderDao.findById4Detail(id);
        if(map != null){
            //处理日期格式
            Date orderDate = (Date) map.get("orderDate");
            try{
                map.put("orderDate",DateUtils.parseDate2String(orderDate));
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return map;
    }
}















